<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>MySQL</title>
    <link rel="stylesheet" href="css/bootstrap.min.css">
</head>
<body>
<pre style="font-size:18px">
    <kbd>SQL分类</kbd>
    1. <b>DDL</b>(Data Definition Languages)语句:数据定义语言
        这些语句定义了不同的数据段,数据库,表,列,索引等数据库对象.
        常用的语句关键字包括create,drop,alter...

    2. <b>DML</b>(Data Manipulation Language)语句:数据操纵语言
        用于添加,删除,更新和查询数据库记录,并检查数据库完整性.
        常用的语句关键字主要包括insert,delete,update,select...

    3. <b>DCL</b>(Data Control Language)语句:数据控制语言
        用于控制不同数据段直接的许可和访问级别的语句.这些语句定义了数据库,表,字段,用户的访问权限和安全级别.
        主要的语句关键字包括grant,revoke...

    <kbd>DDL语句</kbd>
    DDL是对数据库内部的对象进行创建,删除,修改等操作的语言.一般为数据库管理员(DBA)使用.

    1.创建数据库

    <b>MySQL开始界面</b>
    =============================================================================
    <i>Welcome to the MySQL monitor.  Commands end with <b>;</b> or <b>\g.</b>
    Your MySQL connection id is 2
    Server version: 5.6.17 MySQL Community Server (GPL)

    Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.

    Type 'help;' or '<b>\h</b>' for help. Type '<b>\c</b>' to clear the current input statement.</i>
    ==============================================================================
    <i>说明sql语句以;或者\g结尾,\h为帮助打开帮助文档,\c为清理命令行buffer.执行命令均为按下回车键.</i>

    1) <b><i>CREATE DATABASE dbname</i></b> <b style="color:#f92672">[Notice:在Linux和Unix下字段名,表名和数据库名要区分大小写]</b>
        eg:<i><u>create database</u> test1;</i>

    2) Use dbname && show tables

    3) drop database dbname (Notice:数据库删除后,下面的所有表数据均会被删除,所以删除前一定仔细检查并做好备份!)
    在MySQL中drop操作结果均显示"0 rows affected"

    4) create table
    CREATE TABLE tablename(
    column_name_1 column_type_1 constrains,
    column_name_2 column_type_2 constrains,
    ...
    column_name_n column_type_n constrains)
        eg:
            create table emp(
            ename varchar(10),
            hiredate date,
            sal decimal(10,2),
            deptno int(2));

    5) DROP TABLE tablename
        eg:drop table emp;

    6) ALTER TABLE tablename MODIFY [COLUMN] column_definition [FIRST|AFTER col_name]
        eg:alter table emp modify ename varchar(20);

    7) ALTER TABLE tablename ADD [COLUMN] column_definition [FIRST|AFTER col_name]
        eg:alter table emp add column age int(3);

    8) ALTER TABLE tablename DROP [COLUMN] col_name
        eg:alter table emp drop column age;

    9) ALTER TABLE tablename CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name]
        eg:alter table emp change age age1 int(4);

    10) 修改字段排序
        eg:alter table emp add birth date after ename;

    11)ALTER TABLE tablename RENAME [TO] new_tablename

    <kbd>DML语句</kbd>
    DML操作是指对数据库中表记录的操作,主要包括记录的插入(insert),更新(update),删除(delete)和查询(select)

    1) INSERT INTO tablename(field1,field2,...,fieldn) VALUES(val1,val2,...,valn);
        eg:insert into emp(ename,hiredate,sal,deptno) values('zxxl','2000-01-01','2000',1);
            不指定字段名
           insert into emp values();

    2) UPDATE tablename SET field1=value,field2=value2,...,fieldn=valuen [WHERE CONDITION]
        eg:update emp set sal=4000 where ename='lisa';

    2.5) update多表数据更新
    UPDATE t1,t2,...,tn set t1.field1=expr1,tn.fieldn=exprn [WHERE CONDITION]
        eg:update emp a,dep b set a.sal=a.sl*b.deptno,b.deptname=a.ename where a.deptno=b.deptno;

    3) DELETE FROM tablename [WHERE CONDITION]
        eg:delete from emp where ename='dony';

    3.5) DELETE t1,t2,...,tn FROM t1,t2,...,tn [WHERE CONDITION]
        eg:delete a,b from emp a,dept b where a.deptno=b.deptno and a.deptno=3;

    4) SELECT * FROM tablename [WHERE CONDITION]
        eg:select*from emp;

    4.1) 查询不重复的记录
    关键字distinct----去除重复后显示

    4.2) 条件查询
        eg:select * from emp where deptno=1;

    4.3) 排序与限制
        ORDER BY
    SELECT * FROM tablename [WHERE CONDITION] [ORDER BY field1 [DESC|ASC],field2 [DESC|ASC],...,fieldn [DESC|ASC]]
        eg:select * from emp order by sal;

    读取部分数据
    SELECT...[LIMIT offset_start,row_count]
        eg:select * from emp order by sal limit 3;

    注:limit经常和order by一起配合使用来记录的分页显示

    4.4) 聚合
    聚合操作的语法如下:
    SELECT [field1,field2,...,fieldn] fun_name FROM tablename [WHERE where_contition] [GROUP BY field1,field2,...,fieldn [WITH ROLLUP]] [HAVING where_contition]

    对应参数说明:
    fun_name:表示要做的聚合操作,也就是聚合函数,常用的有sum,count(*),max,min
    GROUP BY:关键字表示要进行分类聚合的字段,比如要按照部门分类统计员工数量,部门就应该写在group by后面
    WITH ROLLUP:可选语法,表明是否对分类聚合后的结果进行再汇总
    HAVING:表示对分类后的结果再进行条件过滤
    注:having和where的区别在于,having是对聚合后的结果进行条件的过滤,而where是在聚合前就对记录进行过滤,
    如果逻辑允许,我们尽可能先用where过滤记录,这样因为结果集减小,将对聚合的效率大大提升,最后再根据逻辑看是否用having进行过滤.

    eg:select count(1) from emp;select deptno,count(1) from emp group by deptno;

    4.5) 表连接
    当需要同时显示多个表中的字段时,就可以用表连接来实现这样的功能.
    从大类上分,表连接分为内连接和外连接,它们之间的最主要区别是,内连接仅选出两张表中互相匹配的记录,而外链接会选出其他不匹配的记录.
    最常见的为内连接.

    内连接:
        eg:select ename,deptname from emp ,dept where emp.deptno=dept.deptno;

    外连接:外连接又分为左连接和右连接.
    左连接:包含所有的左边表中的记录甚至是右边表中没有和它匹配的记录.
    右连接:包含所有的右边表中的记录甚至是左边表中没有和它匹配的记录.
        eg:
        left join:select ename,deptname from emp left join dept on emp.deptno=dept.deptno;
        right join:select ename,deptname from dept right join emp on dept.deptno=emp.deptno;

    4.6) 子查询
    某些情况下,当进行查询的时候,需要的条件是另外一个select语句的结果,这个时候,就用到子查询了.
    用于子查询的关键字主要包括in,not in,=,!=,exists,not exists...
        eg:select * from emp where deptno in(select deptno from dept);

    子查询可以转化为表连接???
    主要应用:1.MySQL4.1以前不支持子查询,需要表连接实现子查询功能. 2.表连接在很多情况下用于优化子查询

    4.7) 记录联合
    我们经常碰到将两个表的数据按照一定的查询条件查询出来后,将结果合并到一起显示出来,这个时候,就需要用union和union all关键字来实现这样的功能.
    具体语法如下:
        SELECT * FROM t1 UNION|UNION ALL SELECT * FROM t2 ... UNION|UNION ALL SELECT * FROM tn;

    union和union all的主要区别是union all是把结果集直接合并在一起,而union是将union all后的结果进行一次DISTINCT,去除重复记录后的结果.

    <kbd>DCL语句</kbd>
    DCL语句主要是DBA用来管理系统中的对象权限时使用,一般的开发人员很少使用.
    ...
</pre>
</body>
</html>